package peace.gui.controls.buttons {
import flash.display.Shape;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;

import peace.gui.controls.Control;
import peace.gui.controls.SelectEvent;

/**
 * Контрол из кнопки и метки
 */
public class Checkbox extends Control {
    protected static const DEFAULT_WIDTH:int = 20;
    protected static const SPACING:int = 5;
    public var label:TextField;
    protected var button:PushButton;
    /**
     * горячая область контрола
     */
    protected var hit:Sprite = new Sprite();

    /**
     * @param pushbutton кнопка с картинкой "выбрано". <br>
     * Картинка "выбрано" реализуется в виде icon-а, selected-skin тут плохо подходит. <br>
     * Т.о. контрол показывает icon в выделенном состоянии и скрывает в противном случае.
     * @param label
     */
    public function Checkbox(pushbutton:PushButton = null, label:TextField = null) {
        super();

        this.button = pushbutton || createDefaultButtonSkin();
        this.label = label || createDefaultLabel();

        init();
    }

    protected function init():void {
        hit.graphics.beginFill(0, 0);
        hit.graphics.drawRect(0, 0, 1, 1);
        addChild(hit);

        button.getIcon().visible = false;
        button.addEventListener(SelectEvent.CHANGE, onSelect, false, 0, true);
        button.y = 2; // тюнинг
        button.hitArea = hit;
        addChild(button);

        label.multiline = label.wordWrap = true;
        addChild(label);

        width = DEFAULT_WIDTH;
    }

    override public function set width(value:Number):void {
        label.x = button.width + SPACING;
        label.width = value - SPACING - button.width;

        hit.width = value;
        hit.height = super.height;
    }

    private function onSelect(e:SelectEvent):void {
        selected = button.selected;

        dispatchEvent(new SelectEvent(SelectEvent.CHANGE, this));
    }

    override public function get value():* {
        return _selected;
    }

    override public function set value(v:*):void {
        selected = Boolean(v);
    }

    override public function set selected(b:Boolean):void {
        super.selected = b;
        button.selected = b;
        button.getIcon().visible = b;
    }

    protected function createDefaultButtonSkin():PushButton {
        var icon:Shape = new Shape();
        icon.graphics.beginFill(0);
        icon.graphics.drawRect(0, 0, 4, 4);

        var b:PushButton = new PushButton(null, null, null, null, null, icon);
        b.width = b.height = 10;
        return b;
    }

    protected function createDefaultLabel():TextField {
        var t:TextField = new TextField();
        t.defaultTextFormat = new TextFormat("arial", 12);
        t.selectable = t.mouseEnabled = false;
        t.autoSize = TextFieldAutoSize.LEFT;
        return t;
    }
}
}